#ifndef __CONFIG_H__
#define __CONFIG_H__

#include <stddef.h>
#include <pthread.h>

#include "../log/systemLog/systemLog.h"

#define CONFIG_MAX_IP_LEN 64
#define CONFIG_MAX_PATH_LEN 256
#define CONFIG_MAX_HOST_LEN 128
#define CONFIG_MAX_USER_LEN 64
#define CONFIG_MAX_PASS_LEN 128
#define CONFIG_MAX_DB_LEN 64

// server_config_t: 保存服务器与数据库连接相关的配置信息。
// 加载时会把配置文件中的对应字段解析并填入此结构体。
typedef struct server_config_s
{
    char server_ip[CONFIG_MAX_IP_LEN];         // 服务器监听的 IP 地址，例如 127.0.0.1
    int server_port;                           // 服务器监听的端口号，例如 8080
    char root_dir[CONFIG_MAX_PATH_LEN];        // 服务器暴露的文件根目录，例如 /var/lib/cloudisk
    char mysql_host[CONFIG_MAX_HOST_LEN];      // MySQL 主机地址
    int mysql_port;                            // MySQL 端口号，通常为 3306
    char mysql_user[CONFIG_MAX_USER_LEN];      // 连接 MySQL 的用户名
    char mysql_password[CONFIG_MAX_PASS_LEN];  // 连接 MySQL 的密码
    char mysql_db[CONFIG_MAX_DB_LEN];          // 使用的 MySQL 数据库名称
    char system_log_path[CONFIG_MAX_PATH_LEN]; // 系统日志默认路径
} server_config_t;

extern char g_root_dir[CONFIG_MAX_PATH_LEN];
// 全局系统日志路径（加载配置后填充）
extern char g_system_log_path[CONFIG_MAX_PATH_LEN];

// 全局 MySQL 连接配置，线程池中各线程可使用这些配置建立自己的连接
extern char g_mysql_host[CONFIG_MAX_HOST_LEN];
extern int g_mysql_port;
extern char g_mysql_user[CONFIG_MAX_USER_LEN];
extern char g_mysql_password[CONFIG_MAX_PASS_LEN];
extern char g_mysql_db[CONFIG_MAX_DB_LEN];

// 保护 MySQL 的互斥锁
extern pthread_mutex_t g_mysql_lock;

/**
 * @brief 从指定路径解析并加载服务器配置文件到给定结构体中。
 *
 * 解析规则：每行 key=value，支持以 '#' 或 ';' 开头的注释或行内注释，
 * 会去除行首行尾空白后再解析。必须包含以下字段：
 * server_ip, server_port, root_dir, mysql_host, mysql_port, mysql_user, mysql_password, mysql_db。
 *
 * @param path 配置文件路径（例如："/etc/cloudisk/server.conf"）
 * @param cfg 输出：已填充的 `server_config_t` 结构体指针，调用前应保证非 NULL
 * @return system_error_code_t 成功返回 SYSTEM_ERR_OK，错误返回以下负值之一：
 *         SYSTEM_ERR_INVALID_ARGUMENT 参数非法
 *         SYSTEM_ERR_CONFIG_FILE 配置文件打开失败
 *         SYSTEM_ERR_CONFIG_PARSE 配置解析错误（格式或数值不合法）
 *         SYSTEM_ERR_CONFIG_MISSING 缺少必需字段
 *         SYSTEM_ERR_CONFIG_OVERFLOW 字段长度超过缓冲区
 */
system_error_code_t load_server_config(const char *path, server_config_t *cfg);

// 配置加载返回值检查宏，仅记录错误不改变控制流
#define CONFIG_LOAD_CHECK(ret)                                                \
    do                                                                        \
    {                                                                         \
        system_error_code_t _ret = (ret);                                     \
        if (_ret != SYSTEM_ERR_OK)                                            \
        {                                                                     \
            SYSTEM_LOG_ERROR(_ret, "load_server_config failed ret=%d", _ret); \
        }                                                                     \
    } while (0)

#endif // __CONFIG_H__
